/** 
 * @addtogroup j1939tp
 * j1939tp
 * @brief j1939 公共头文件
 * 
 * 本文件提供了一些J1939通用数据类型定义
 * 
 * @{ 
 * @file         j1939_common.h
 * @brief        J1939 公共头文件定义，包含CAN通道定义、帧格式定义、J1939 CAN消息定义等
 * @note         
 * @author       lixinliang
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author                     <th>Description
 * <tr><td>2019-09-20  <td>1.0                   <td>lixinliang@hopechart.com   <td>创建初始版本
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */

#ifndef _J1939_COMMON_H_
#define _J1939_COMMON_H_

#include "ofc/ofc_types.h"
#include "ofc/ofc_object.h"

#ifdef __cplusplus
extern "C"
{
#endif

#define J1939_CAN_DATA_LEN        (8) // CAN_FD = 64

/**
 * can 通道枚举
 */
enum TJ1939CanxChnEnumTag
{
    kJ1939CanxChn0 = 0x00,
    kJ1939CanxChn1 = 0x01,
    kJ1939CanxChn2 = 0x02,
    kJ1939CanxChnMax,
};
typedef enum TJ1939CanxChnEnumTag TJ1939CanxChnEnum;

/**
 * can帧类型
 */
enum TJ1939CanIdFmtEnumTag
{
    kJ1939CanIdFmtStand  = 0,    ///< 标准帧
    kJ1939CanIdFmtExpand = 1,    ///< 扩展帧
};
typedef enum TJ1939CanIdFmtEnumTag TJ1939CanIdFmtEnum;

/**
 * 多帧发送类型
 */
enum TJ1939MultiTypeEnumTag
{
    kJ1939MultiTypeBroadcast = 0,    ///< 广播发送
    kJ1939MultiTypeP2p       = 1,    ///< P2P发送
};
typedef enum TJ1939MultiTypeEnumTag TJ1939MultiTypeEnum;

/**
 * J1939的can结果码
 */
enum TJ1939ResultEnumTag
{
    kJ1939ResultOk        = 0,    ///< 成功
    kJ1939ResultFailed    = -1,   ///< 失败
    kJ1939ResultTimeout   = -2,   ///< 超时
    kJ1939ResultAbort     = -4,   ///< 异常终止
    kJ1939ResultNoMem     = -4,   ///< 没有内存
    kJ1939ResultParamError= -5,   ///< 参数错误
};
typedef enum TJ1939ResultEnumTag  TJ1939ResultEnum;

/**
 * J1939 详细数据
 */
struct TJ1939DetailTag
{
    UInt32 channel:2;       ///< 通道号 0~2 参见 TJ1939CanxChnEnum
    UInt32 id_format:1;     ///< 帧格式 1:扩展帧 0:标准帧 参见 TJ1939CanIdFmtEnum
    UInt32 data_len:6;      ///< 数据长度 1~8 CANFD 64字节
    UInt32 reserved:23;     ///< 预留
};
typedef struct TJ1939DetailTag TJ1939Detail;

/**
 * J1939的can消息
 */
struct TJ1939CanMsgTag
{
    UInt32       can_id;      ///< CAN ID
    TJ1939Detail detail;      ///< CAN 通道、格式等标记
    UInt8        data[J1939_CAN_DATA_LEN]; ///< 附加消息数据
};
typedef struct TJ1939CanMsgTag TJ1939CanMsg;

/**
 * J1939的处理后的can消息 单帧/多帧
 */
typedef struct TJ1939DcmMsgTag TJ1939DcmMsg;
struct TJ1939DcmMsgTag
{
    UInt32 can_id;    ///< CAN ID
    UInt8  channel;   ///< CAN 通道
    UInt8  padding;   ///< 对齐，预留 
    UInt16 data_len;  ///< 数据长度， 理论上最大值1785
    UInt8  *data;     ///< 数据内容
};

/**
 * J1939发送多帧状态通知结构
 */
typedef struct TJ1939TxMsgTag TJ1939TxMsg;
struct TJ1939TxMsgTag
{
    UInt8               tx_type;    ///< 发送类型
    TJ1939CanxChnEnum   channel;    ///< CAN通道
    UInt32              pgn;        ///< PGN
    UInt8               dest_addr;  ///< 目标地址
};

#ifdef __cplusplus
}  // extern "C"
#endif

#endif // _J1939_COMMON_H_

/** @} */
